/**
 * MCP服务器配置管理服务
 * 
 * 功能特性：
 * - MCP服务器配置管理
 * - 服务器连接状态监控
 * - 配置增删改查
 * - 连接测试和验证
 * 
 * @author CKY Agent Platform Team
 * @version 1.0.0
 * @lastModified 2024-01-15
 */

import axios from 'axios';

// API日志工具导入
import apiLogger from '@utils/apiLogger';

// API基础URL配置
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:6001';

/**
 * 创建axios实例
 */
const api = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
  },
});

// 集成API日志记录
apiLogger.createAxiosInterceptors(api);

/**
 * 请求拦截器
 */
api.interceptors.request.use((config) => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

/**
 * 响应拦截器
 */
api.interceptors.response.use(
  (response) => response.data,
  (error) => {
    console.error('MCP Server API Error:', error);
    return Promise.reject(error);
  }
);

/**
 * MCP服务器状态枚举
 */
export enum McpServerStatus {
  Connected = 'connected',
  Disconnected = 'disconnected',
  Connecting = 'connecting',
  Error = 'error'
}

/**
 * MCP服务器配置接口
 */
export interface McpServerConfig {
  id: string;
  name: string;
  serverUrl: string;
  description?: string;
  connectTimeoutMs: number;
  isActive: boolean;
  status: McpServerStatus;
  toolCount: number;
  resourceCount: number;
  lastConnectedAt?: string;
  createdAt: string;
  updatedAt?: string;
}

/**
 * 创建MCP服务器配置DTO
 */
export interface CreateMcpServerConfigDto {
  name: string;
  serverUrl: string;
  description?: string;
  connectTimeoutMs: number;
  isActive?: boolean;
}

/**
 * 更新MCP服务器配置DTO
 */
export interface UpdateMcpServerConfigDto {
  name?: string;
  serverUrl?: string;
  description?: string;
  connectTimeoutMs?: number;
  isActive?: boolean;
}

/**
 * MCP服务器状态信息
 */
export interface McpServerStatusInfo {
  clientId: string;
  serverUrl: string;
  isConnected: boolean;
  toolCount: number;
  resourceCount: number;
  status: McpServerStatus;
  lastConnectedAt?: string;
  errorMessage?: string;
}

/**
 * MCP服务器统计信息
 */
export interface McpServerStats {
  totalServers: number;
  connectedServers: number;
  totalTools: number;
  totalResources: number;
  averageResponseTime: number;
}

/**
 * 分页结果DTO
 */
export interface PagedResultDto<T> {
  items: T[];
  totalCount: number;
}

/**
 * MCP服务器管理服务
 */
const mcpServerService = {
  /**
   * 获取MCP服务器配置列表
   * @param {Object} params - 查询参数
   * @returns {Promise<PagedResultDto<McpServerConfig>>} 分页的MCP服务器配置列表
   */
  async getServerConfigs(params: {
    filter?: string;
    isActive?: boolean;
    status?: McpServerStatus;
    skipCount?: number;
    maxResultCount?: number;
  }): Promise<PagedResultDto<McpServerConfig>> {
    const queryParams = new URLSearchParams();
    if (params.filter) queryParams.append('Filter', params.filter);
    if (params.isActive !== undefined) queryParams.append('IsActive', params.isActive.toString());
    if (params.status) queryParams.append('Status', params.status);
    if (params.skipCount) queryParams.append('SkipCount', params.skipCount.toString());
    if (params.maxResultCount) queryParams.append('MaxResultCount', params.maxResultCount.toString());

    return api.get(`/api/app/mcp-server?${queryParams.toString()}`);
  },

  /**
   * 根据ID获取MCP服务器配置
   * @param {string} id - 服务器配置ID
   * @returns {Promise<McpServerConfig>} MCP服务器配置详情
   */
  async getServerConfig(id: string): Promise<McpServerConfig> {
    return api.get(`/api/app/mcp-server/${id}`);
  },

  /**
   * 创建MCP服务器配置
   * @param {CreateMcpServerConfigDto} data - 创建数据
   * @returns {Promise<McpServerConfig>} 创建的MCP服务器配置
   */
  async createServerConfig(data: CreateMcpServerConfigDto): Promise<McpServerConfig> {
    return api.post('/api/app/mcp-server', data);
  },

  /**
   * 更新MCP服务器配置
   * @param {string} id - 服务器配置ID
   * @param {UpdateMcpServerConfigDto} data - 更新数据
   * @returns {Promise<McpServerConfig>} 更新后的MCP服务器配置
   */
  async updateServerConfig(id: string, data: UpdateMcpServerConfigDto): Promise<McpServerConfig> {
    return api.put(`/api/app/mcp-server/${id}`, data);
  },

  /**
   * 删除MCP服务器配置
   * @param {string} id - 服务器配置ID
   * @returns {Promise<void>} 无返回值
   */
  async deleteServerConfig(id: string): Promise<void> {
    return api.delete(`/api/app/mcp-server/${id}`);
  },

  /**
   * 测试MCP服务器连接
   * @param {string} id - 服务器配置ID
   * @returns {Promise<Object>} 测试结果
   */
  async testServerConnection(id: string): Promise<any> {
    return api.post(`/api/app/mcp-server/${id}/test-connection`);
  },

  /**
   * 连接MCP服务器
   * @param {string} id - 服务器配置ID
   * @returns {Promise<void>} 无返回值
   */
  async connectServer(id: string): Promise<void> {
    return api.post(`/api/app/mcp-server/${id}/connect`);
  },

  /**
   * 断开MCP服务器连接
   * @param {string} id - 服务器配置ID
   * @returns {Promise<void>} 无返回值
   */
  async disconnectServer(id: string): Promise<void> {
    return api.post(`/api/app/mcp-server/${id}/disconnect`);
  },

  /**
   * 重启MCP服务器连接
   * @param {string} id - 服务器配置ID
   * @returns {Promise<void>} 无返回值
   */
  async restartServer(id: string): Promise<void> {
    return api.post(`/api/app/mcp-server/${id}/restart`);
  },

  /**
   * 获取所有服务器状态
   * @returns {Promise<McpServerStatusInfo[]>} 服务器状态列表
   */
  async getAllServerStatuses(): Promise<McpServerStatusInfo[]> {
    return api.get('/api/app/mcp-server/statuses');
  },

  /**
   * 获取MCP服务器统计信息
   * @returns {Promise<McpServerStats>} 统计信息
   */
  async getServerStats(): Promise<McpServerStats> {
    return api.get('/api/app/mcp-server/stats');
  },

  /**
   * 同步服务器工具到数据库
   * @param {string} id - 服务器配置ID
   * @returns {Promise<Object>} 同步结果
   */
  async syncServerTools(id: string): Promise<any> {
    return api.post(`/api/app/mcp-server/${id}/sync-tools`);
  },

  /**
   * 获取服务器可用工具
   * @param {string} id - 服务器配置ID
   * @returns {Promise<Object>} 工具列表
   */
  async getServerTools(id: string): Promise<any> {
    return api.get(`/api/app/mcp-server/${id}/tools`);
  },

  /**
   * 获取服务器可用资源
   * @param {string} id - 服务器配置ID
   * @returns {Promise<Object>} 资源列表
   */
  async getServerResources(id: string): Promise<any> {
    return api.get(`/api/app/mcp-server/${id}/resources`);
  }
};

export default mcpServerService;